#ifndef _DEC_TABLE_H_
#define _DEC_TABLE_H_

#include "common.h"

#define ROOT_INDEX 256 

typedef uint32_t index_t; 	
typedef uint32_t value_t;	

/*!
	\struct node
	\brief Nodo della struttura dati del decompressore, contiene le informazioni su un nodo dell'albero. L'indice del nodo coincide con l'indice all'interno dell'array
	\param parent Indice del nodo padre
	\param symbol Simbolo contenuto nell' i-esimo nodo
	
*/


typedef struct {
	index_t parent;
	uint8_t symbol;
	
} node;

/*!
	\function void init_table(node* tab)
	\brief Inizializza i primi 255 elementi dell'array con il corrispondente carattere ASCII
	\param tab Puntatore alla struttura dati
	
*/
void init_table(node* tab);

/*!
	\function void insert(node *tab, index_t parent, uint8_t symbol, value_t value)
	\brief Riempie un nodo nell'albero del decompressore con i valori passati
	\param tab Puntatore alla struttura dati
	\param parent Indice del nodo padre
	\param symbol Simbolo da inserire
	\param value Posizione del nodo da riempire

*/
void insert(node *tab, index_t parent, uint8_t symbol, value_t value);

/*!
	\function uint8_t get_symbol (node *tab, value_t value, index_t *parent)
	\brief Restituisce il simbolo contenuto in un certo indice	
	\param tab Puntatore alla struttura dati
	\param value Indice dell'elemento di cui vogliamo conoscere il simbolo contenuto
	\param parent Padre dell'elemento di indice value
*/
uint8_t get_symbol (node *tab, value_t value, index_t *parent);

/*!
	\function void print_table(node* tab)
	\brief Stampa gli elementi contenuti nell'array
	\param tab Puntatore alla struttura dati
*/
void print_table(node* tab);

#endif
